home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_2 / areuh.tar / areuh / assembler / amain.c < prev    next >
C/C++ Source or Header  |  1990-10-10  |  6KB  |  212 lines

  1. /*
  2.  * Authors :
  3.  *   Pierre DAVID (pda@masi.ibp.fr or pda@frunip62.bitnet)
  4.  *   Janick TAILLANDIER
  5.  *
  6.  * This program can be freely used or distributed as long as this
  7.  * note is kept.
  8.  *
  9.  * This program is provided "as is".
  10.  */
  11.  
  12. /******************************************************************************
  13.  
  14.                                 TITAN ASSEMBLER
  15.  
  16.                                  MAIN FONCTION
  17.  
  18.  
  19. main, prompt
  20.  
  21. ******************************************************************************/
  22.  
  23. #include "aglobal.h"
  24.  
  25. struct symbol *h_label[256] ;
  26.  
  27. struct xused *headxu ;
  28.  
  29. uchar fsource [MAXLEN+1], flisting [MAXLEN+1], fobject [MAXLEN+1] ;
  30. FILE *fd_s, *fd_l, *fd_o ;
  31.  
  32. int cntlist, cntlist_ref ;
  33. int page_size ;
  34. uchar l_title[MAXLEN+1], l_stitle[MAXLEN+1];
  35. int errcnt, error_this_line ;
  36. int print_this_line ;
  37. int xref ;
  38. int running ;
  39. int passnb ;
  40. int linenb ;
  41.  
  42. saddr pc ;
  43. int gen_len ;
  44. uchar gen_code[19] ;
  45. int prev_test ;
  46. int exec, in_if, in_else ;
  47.  
  48. int modular, linker ;
  49.  
  50.  
  51. extern void init(), between(), term(), pass() ;
  52. extern int read_line() ;
  53.  
  54.  
  55. /******************************************************************************
  56.  
  57.                                      MAIN
  58.  
  59.  
  60.  
  61.  
  62. synopsis : aas  [-p]  [-l n] [-A] [-a afile] [-o objfile]  [file1 [... filen]]
  63.  
  64. description : Aas is a cross assembler which runs on UNIX based machines.
  65.               Aas assembles the named file, or the standard input if no file
  66.               is specified. The optional arguments -a or -A may be used to
  67.               obtain an assembly listing. If -A is used, listing goes to
  68.               standard output. If -a is used, the listing goes to afile.
  69.               -l option specifies page length.
  70.               The output of assembly is left in the filoe objfile; if that is
  71.               omitted, then the output is left in a file "lex".
  72.  
  73. ******************************************************************************/
  74.  
  75. main (argc, argv)
  76. int argc ;
  77. char *argv[] ;
  78. {
  79.     int  r = 0, c, i ;
  80.     int errflg = 0 ;
  81.     int errrep = 0 ;
  82.     char saveo [MAXLEN+1], savel [MAXLEN+1] ;
  83.  
  84.     extern char *optarg ;
  85.     extern int optind, opterr ;
  86.  
  87.  
  88.     opterr = 0 ;
  89.  
  90. /* par defaut, on a : */
  91.     xref = 0 ;                      /* pas de cross ref */
  92.     page_size = 0 ;                 /* taille de page non fournie */
  93.     cntlist_ref = 0 ;               /* pas de listing */
  94.     strcpy (fobject, "") ;          /* fichier objet := "" */
  95.     strcpy (fsource, "") ;          /* fichier source := "" */
  96.     strcpy (flisting, "") ;         /* fichier listing := "" */
  97.  
  98. /* analyse des options */
  99.     while ((c = getopt(argc, argv, "xa:Apl:o:")) != EOF)
  100.         switch (c)
  101.         {
  102.             case 'x' :                               /* cross-ref */
  103.                 xref = 1 ;
  104.                 break ;
  105.             case 'a' :                               /* listing sur fichier */
  106.                 strcpy (flisting, optarg) ;
  107.                 cntlist_ref = 2 ;
  108.                 break ;
  109.             case 'A' :                               /* listing sur stdout */
  110.                 cntlist_ref = 1 ;
  111.                 break ;
  112.             case 'p' :                               /* prompt */
  113.                 r++ ;                                /* r := 1 */
  114.                 break ;
  115.             case 'l' :                               /* page length */
  116.                 sscanf (optarg, "%d", &page_size) ;  /* page_size := -l <n> */
  117.                 break ;
  118.             case 'o' :                               /* object file */
  119.                 strcpy (fobject, optarg) ;
  120.                 break ;
  121.             case '?' :                               /* non reconnu */
  122.                 errflg++ ;
  123.                 break ;
  124.         }
  125. /* si on a demande "-p", ou si pas d'argument : interface interactive */
  126.     if ((r)||(argc==1)) prompt () ;
  127. /* si option non reconnue ou si pas de nom de source, alors erreur */
  128.     if (errflg || ((optind==argc)&&(fsource[0]==EOL)))
  129.         error (ERRUSA, "") ;
  130.  
  131. /* page_size = 72 par defaut */
  132.     if (page_size==0)         page_size = 72 ;
  133.  
  134.     if (*fsource)               /* got source file name with prompt() */
  135.     {
  136.         init() ;
  137.         pass() ;
  138.         between() ;
  139.         pass() ;
  140.         term() ;
  141.         errrep = errcnt ;
  142.     }
  143.     else
  144.     {
  145.         for (i=optind; i<argc; i++)
  146.         {
  147.             strcpy (saveo, fobject) ;
  148.             strcpy (savel, flisting) ;
  149.             strcpy (fsource, argv [i]) ;
  150.             if (optind != argc-1)  printf ("%s:\n", fsource) ;
  151.             init() ;
  152.             pass() ;
  153.             between() ;
  154.             pass() ;
  155.             term() ;
  156.             strcpy (fobject, saveo) ;
  157.             strcpy (flisting, savel) ;
  158.             errrep += errcnt ;
  159.         }
  160.     }
  161.     exit (errrep) ;                  /* permet de signaler les erreurs */
  162. }
  163.  
  164.  
  165. /******************************************************************************
  166.  
  167.                                     PROMPT
  168.  
  169.  
  170. synopsis : prompt()
  171. description : if "-p" option is used, prompts the user for files to be used.
  172.  
  173. ******************************************************************************/
  174.  
  175. prompt ()
  176. {
  177.     uchar line[MAXLEN+1] ;
  178.  
  179.     while (fsource[0]==EOL)
  180.     {
  181.         printf ("Source  file : ") ;
  182.         read_line (stdin, fsource) ;
  183.     }
  184.     if (fobject[0]==EOL)
  185.     {
  186.         printf ("Object  file : ") ;
  187.         read_line (stdin, fobject) ;
  188.     }
  189.     if (cntlist_ref==0)
  190.     {
  191.         printf ("Listing file : ") ;
  192.         read_line (stdin, flisting) ;
  193.         cntlist_ref = (flisting[0]) ? 2 : 0 ;
  194.     }
  195.     if (cntlist_ref)
  196.     {
  197.         if (xref==0)
  198.         {
  199.             printf ("Cross reference (y/n) : ") ;
  200.             read_line (stdin, line) ;
  201.             if ((*line=='y')||(*line=='Y')||(*line=='o')||(*line=='O'))
  202.                 xref = 1 ;
  203.         }
  204.         if (page_size==0)
  205.         {
  206.             printf ("Page length : ") ;
  207.             read_line (stdin, line) ;
  208.             sscanf (line, "%d", &page_size) ;
  209.         }
  210.     }
  211. }
  212.